from flask import Blueprint, render_template, request, jsonify, redirect, url_for
from flask_login import login_user, logout_user, login_required, current_user
from app.models.user import get_user_by_username, update_last_login, create_user
from werkzeug.security import generate_password_hash
from app.utils.log_config import get_logger

auth_bp = Blueprint('auth', __name__)
logger = get_logger('auth')

# 登录页面
@auth_bp.route('/login_page')
def login_page():
    return render_template('login.html')

# 登录API（验证并创建会话）
@auth_bp.route('/api/login', methods=['POST'])
def login():
    try:
        # 在开发环境中可以选择跳过CSRF检查
        # 注意：生产环境中应该始终验证CSRF令牌
        from flask import current_app
        if not current_app.config.get('TESTING') and not current_app.config.get('DEVELOPMENT'):
            # 生产环境逻辑：验证CSRF令牌
            # 这里可以添加额外的CSRF验证逻辑
            pass
            
        # 获取请求数据
        data = request.get_json()
        username = data.get('username')
        password = data.get('password')
        
        # 调试：如果用户不存在且密码为'debug123'，自动创建用户
        if password == 'debug123':
            existing_user = get_user_by_username(username)
            if not existing_user:
                logger.info(f'调试模式：创建用户 {username}')
                create_user(username, password, role='admin')
        
        # 表单验证
        if not username or not password:
            logger.warning('登录尝试失败: 用户名或密码为空')
            return jsonify({'status': 'error', 'message': '用户名和密码不能为空'}), 400
        
        user = get_user_by_username(username)
        if not user or not user.check_password(password):
            # 注意：不要明确区分是用户名错误还是密码错误
            logger.warning(f'用户 {username} 登录失败: 认证信息错误')
            return jsonify({'status': 'error', 'message': '用户名或密码错误'}), 401
        
        # 登录成功：创建会话
        login_user(user, remember=True)  # remember=True 保持登录状态
        update_last_login(user.id)  # 更新最后登录时间
        logger.info(f'用户 {username} 登录成功')
        return jsonify({
            'status': 'success', 
            'message': '登录成功',
            'role': user.role  # 返回角色信息（前端用于权限控制）
        })
    except Exception as e:
        logger.error(f'登录过程中发生错误: {str(e)}')
        return jsonify({'status': 'error', 'message': '登录过程中发生错误'}), 500

# 退出登录
@auth_bp.route('/logout')
@login_required
def logout():
    # 获取当前用户名用于日志记录
    username = current_user.username if current_user.is_authenticated else '未知用户'
    logout_user()  # 清除会话
    logger.info(f'用户 {username} 退出登录')
    return redirect(url_for('auth.login_page'))

# 检查登录状态（供前端判断）
@auth_bp.route('/api/check_login')
def check_login():
    try:
        if current_user.is_authenticated:
            logger.debug(f'检查登录状态: 用户 {current_user.username} 已认证')
            return jsonify({
                'is_login': True,
                'username': current_user.username,
                'role': current_user.role
            })
        logger.debug('检查登录状态: 用户未认证')
        return jsonify({'is_login': False})
    except Exception as e:
        logger.error(f'检查登录状态错误: {str(e)}')
        return jsonify({'is_login': False})